package com.fitness.dao;

import com.fitness.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 通用数据库访问对象基类，封装了获取连接、关闭资源、通用增删改查方法
 */
public class BaseDAO {

    /**
     * 获取数据库连接
     * @return 数据库连接对象
     * @throws SQLException 数据库连接异常
     */
    protected Connection getConnection() throws SQLException {
        return DBUtil.getConnection();
    }

    /**
     * 关闭数据库资源（连接、语句、结果集）
     * @param conn 数据库连接对象
     * @param pstmt SQL执行语句对象
     * @param rs 结果集对象
     */
    protected void closeResources(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
            if (pstmt != null) {
                pstmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 通用执行增、删、改 SQL 语句的方法
     * @param sql 要执行的 SQL 语句
     * @param params SQL 语句中的参数
     * @return 受影响的行数
     */
    protected int executeUpdate(String sql, Object... params) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                pstmt.setObject(i + 1, params[i]);
            }
            return pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        } finally {
            closeResources(conn, pstmt, null);
        }
    }

    /**
     * 通用执行查询 SQL 语句的方法，返回 ResultSet（需手动关闭资源）
     * @param sql 要执行的 SQL 语句
     * @param params SQL 语句中的参数
     * @return 查询结果集
     */
    protected ResultSet executeQuery(String sql, Object... params) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                pstmt.setObject(i + 1, params[i]);
            }
            return pstmt.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
}